package main

import (
	"bufio"
	"fmt"
	"github.com/xuri/excelize/v2"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
)

// go build -ldflags '-s -w'
func main() {
	fmt.Printf("输入要查找的Sheet名字: ")
	var sheetName string
	_, _ = fmt.Scanln(&sheetName)

	// 扫描到所有Excel
	files, _ := scanningExcelFiles(".")

	// 是否已找到的标识
	findFlag := false

	// 遍历excel文件
	for _, fileName := range files {
		//处理Excel文件
		if strings.HasSuffix(fileName, ".xlsx") || strings.HasSuffix(fileName, ".xlsm") {
			if findSheetName(fileName, sheetName) {
				findFlag = true
				break
			}
		}
	}

	// 如果没有找到，也给一个友好的提示吧
	if !findFlag {
		fmt.Println()
		fmt.Println("很抱歉, 未能找到包含[" + sheetName + "]的Excel, 请确认输入的名称是否正确")
	}

	fmt.Println()
	fmt.Println("本次查找已结束, 感谢您的使用")
	fmt.Println("请按任意键关闭...")
	input := bufio.NewScanner(os.Stdin)
	input.Scan()
}

func findSheetName(fileName string, sheetName string) bool {
	fmt.Println("正在查找: " + fileName)
	f, err := excelize.OpenFile(fileName)
	if err != nil {
		fmt.Println(err)
		return false
	}
	defer func() {
		// Close the spreadsheet.
		if err := f.Close(); err != nil {
			fmt.Println(err)
		}
	}()

	index := f.GetSheetIndex(sheetName)
	if index >= 0 {
		abs, _ := filepath.Abs(fileName)

		fmt.Println("发现目标, 位置: " + abs)
		fmt.Println("是否打开: 输入 Y 打开")
		var cmd string
		_, _ = fmt.Scanln(&cmd)
		if strings.EqualFold("Y", cmd) {
			command := exec.Command("cmd", "/C", "start", fileName)
			_ = command.Run()
			fmt.Println("已打开")
		} else {
			fmt.Println("您已放弃打开目标文件")
		}

		// 只要找到文件就算
		return true
	}

	return false
}

func Error(s string, a ...interface{}) {
	fmt.Printf(s, a...)
}

// 扫描指定目录下所有Excel文件
// 后缀需要小写方式
func scanningExcelFiles(dirPth string) (files []string, err error) {
	err = filepath.Walk(dirPth, func(filename string, fi os.FileInfo, err error) error { //遍历目录
		// 忽略目录
		if fi.IsDir() {
			return nil
		}

		// 前缀为Excel打开文件也忽略掉
		if strings.HasPrefix(fi.Name(), "~") {
			return nil
		}

		//满足后缀要求的就是Excel
		// 文件名称转化为小写字母
		lowerFilename := strings.ToLower(filename)
		if strings.HasSuffix(lowerFilename, ".xlsx") || strings.HasSuffix(lowerFilename, ".xlsm") || strings.HasSuffix(lowerFilename, ".xls") {
			files = append(files, filename)
		}

		return nil
	})
	return files, err
}
